const { createUser } = require('../service/user.service')
const { ERROR_CODE_SUCCESS, JWT_SECRET } = require('../config/config.default')
const { userRegisterError, success, actionFailed, paramError } = require('../constant/status.type')
const { getUserInfo, updateUserInfoById } = require('../service/user.service')
const jwt = require('jsonwebtoken')

class UserController {
  async register(ctx, next) {
    //错误捕获（添加失败、卡顿、网络断开、数据库错误等）
    try {
      const { user_name, password, is_admin } = ctx.request.body
      const res = await createUser(user_name, password, is_admin)
      if (res) {
        // console.log(res)
        // 4. 返回结果
        ctx.body = {
          code: ERROR_CODE_SUCCESS,
          message: '用户注册成功',
          result: {
            id: res.id,
            user_name: res.user_name,
          },
        }
      }

    } catch (err) {
      console.error(err)
      ctx.app.emit('error', userRegisterError, ctx) // 触发error事件
    }


  }

  async login(ctx) {
    // 1. 获取用户信息(在token的payload中, 记录id, user_name, is_admin)
    try {
      const { user_name } = ctx.request.body
      // 从返回结果对象中剔除password属性, 将剩下的属性放到res对象
      const { password, ...res } = await getUserInfo({ user_name })

      ctx.body = {
        code: ERROR_CODE_SUCCESS,
        message: '登录成功',
        result: {
          // expiresIn:1d 一天过期
          token: jwt.sign(res, JWT_SECRET, { expiresIn: '1d' }),
        },
      }
    } catch (err) {
      console.error(err);
    }
  }




  async changePassword(ctx, next) {
    try {
      //获取用户数据
      const id = ctx.state.user.id
      const password = ctx.request.body.password
      const result = await updateUserInfoById({ id, password })
      if (result) {
        ctx.app.emit('error', success, ctx) // 触发error事件
      } else {
        ctx.app.emit('error', actionFailed, ctx)
      }
    } catch (error) {
      console.error(error);
      if (!ctx.state.user || ctx.state.user.id || !ctx.request.body || !ctx.request.body.password) {
        return ctx.app.emit('error', paramError, ctx)
      }
      return ctx.app.emit('error', actionFailed, ctx)
    }

  }
}

module.exports = new UserController()